Перейти к основному содержимому

5.15. Знаки препинания

Разработчику Архитектору

Знаки препинания

Для новичков один из самых частых источников путаницы — что означают символы вроде .., ;, ' или :, особенно когда они встречаются в непривычных комбинациях. В Lua многие знаки работают иначе, чем в других языках (например, JavaScript или Python), поэтому важно чётко понимать их назначение.

  1. Кавычки (' и "). В Lua оба типа кавычек допустимы для строк, и выбор зависит только от содержимого строки и стиля кода.
local name = "Тимур"
local message = 'Hello from Lua!'

Оба варианта работают одинаково. Разница — только в удобстве экранирования. Удобно использовать двойные кавычки, если внутри строки есть апостроф:

local text = "It's a beautiful day"

Удобно использовать одинарные, если внутри есть цитата:

local quote = 'He said, "Welcome!"'
  1. Апострофы (), например, “smart quotes” из Word — не являются частью синтаксиса и вызовут ошибку:
local wrong = “This won’t work”  -- ОШИБКА: неверные кавычки
  1. Точки с запятой (;) — опциональны, но редко используются. В Lua точки с запятой не обязательны. Интерпретатор автоматически определяет конец выражения (по аналогии с ASI в JavaScript, но проще).
print("Hello")
local x = 10
local y = 20

Вы можете использовать ;, если хотите:

print("Hello"); local x = 10; local y = 20;

Но в сообществе Lua принято не ставить точки с запятой, если только вы не пишете несколько выражений в одной строке.

  1. Запятая (,) — разделитель элементов. Используется повсеместно для разделения параметров функций, элементов таблиц и нескольких значений при присваивании.
-- Параметры функции
function greet(name, age)
print(name .. " is " .. age .. " years old")
end

-- Таблица
local colors = {"red", "green", "blue"}

-- Множественное присваивание
local x, y, z = 1, 2, 3

В отличие от JavaScript, в таблицах можно ставить запятую после последнего элемента — это не ошибка:

local fruits = {
"apple",
"banana",
}

Это удобно при добавлении новых элементов — не нужно менять предыдущую строку.

  1. Точка (.) и двоеточие (:) — доступ к полям и методам. Это одна из ключевых особенностей Lua, особенно при работе с таблицами и ООП. Чтобы получить доступ к полю или вызвать функцию, нужно поставить точку.

Пример:

local person = {name = "Bob", age = 30}

print(person.name) -- -> "Bob"

function person.greet()
print("Hi, I'm " .. person.name)
end

person.greet() -- вызов функции

Вызывать методы можно через двоеточие, это синтаксический сахар для передачи объекта как первого аргумента (self).

function person:greet()
print("Hi, I'm " .. self.name) -- self = person
end

person:greet() -- то же самое, что person.greet(person)

То есть, эти два метода будут эквивалентны:

person:greet()
person.greet(person)
  1. Две точки (..) — конкатенация строк. В Lua нет оператора + для строк (как в JavaScript). Вместо этого используются две точки.
local first = "Hello"
local last = "World"
local full = first .. ", " .. last -- -> "Hello, World"

Будьте осторожны: .. имеет низкий приоритет, лучше брать в скобки при смешивании с числами:

print("Value: " .. 5 + 3)      -- ОШИБКА: попытка склеить строку и результат 5+3
print("Value: " .. (5 + 3)) -- ПРАВИЛЬНО: -> "Value: 8"
  1. Подчёркивание (_) — соглашения и именование. Как и в других языках, _ используется по стилю, но не имеет специального смысла для интерпретатора.

_ часто используется как имя «игнорируемой» переменной, часто используется в циклах for, когда индекс не нужен:

for _, value in ipairs(fruits) do
print(value)
end

_name — соглашение о внутреннем/приватном поле:

local config = {
_api_key = "12345", -- не для внешнего использования
public_url = "https://..."
}

Это не приватность, просто сигнал другим разработчикам.

__name — зарезервировано для метаметодов:

mt.__index = function() ... end
mt.__add = function() ... end

Такие имена — часть механизма метатаблиц.

_ в числах (Luau) — читаемость:

local billion = 1_000_000_000  -- работает в Luau

В Luau (но не в классическом Lua) можно использовать _ как разделитель. В стандартном Lua это вызовет ошибку.

Вот важное отличие от JavaScript, C# и Java:

  • Lua не имеет побитовых операторов |, &, ^ в ядре (до версии 5.2).
  • Нет логических || и && — вместо них используются or и and.

В Lua используются слова:

if x == 1 or y == 2 then
print("At least one condition is true")
end

if x == 1 and y == 2 then
print("Both conditions are true")
end

local result = a or "default" -- как ?? в C# или || в JS

Это делает код более читаемым, но менее компактным.

В Lua 5.3+ появились побитовые операторы: |, &, ~, <<, >>.

В Roblox (Luau) они также поддерживаются. Но записываются они через C-подобные символы, а не слова. Однако в Lua 5.1 (часто используемом как база) этих операций нет — нужно использовать библиотеки вроде bit32.

local flags = permission_read | permission_write

Важно учесть кое-что ещё. В классическом Lua : (двоеточие) используется только для вызова методов с self. В Luau : также используется для аннотаций типов.

-- Luau:
local name: string = "Alice"
function greet(name: string): string
return "Hello, " .. name
end

Это не работает в чистом Lua — будет ошибка синтаксиса. И если видите : type, значит, код написан для Roblox Studio или Luau CLI.

В Lua нет шаблонных строк, как в JavaScript (Hello ${name}). Чтобы вставлять переменные в строки, используйте конкатенацию:

local name = "Timur"
print("Hello, " .. name .. "!") -- единственный способ

Lua делает ставку на читаемость и простоту, поэтому использует слова вместо символов (or, and), отказывается от лишних знаков (;), даёт гибкость через таблицы и метатаблицы. Поэтому, если вы уже знакомы с другими скриптовыми языками, может быть непривычно.